
package model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;


public class Usuario implements Serializable {
    
    private String rg;
    private String cpf;
    private String nome;       
    private String sexo;
    private String email;

    
    private String senha;
    private ArrayList<Playlist> playlists;
    private Conta contaUsuario;
    private ArrayList<Avaliacao> avaliacoes;
            
    /**
     * Construtor definitivo de um usuário no sistema
     * @param rg rg do usuario (deve ser único no sistema)
     * @param cpf cpf do usuário (deve ser único no sistema)
     * @param nome nome do usuário
     * @param saldo saldo inicial do usuário
     * @param sexo sexo do usuário
     * @param email endereço de email do usuário, utilizado para login (deve ser único no sistema)
     * @param senha senha do usuário para login no sistema.
     */
    public Usuario(String rg, String cpf, String nome, int saldo, String sexo, String email, String senha) {
        this.rg = rg;
        this.cpf = cpf;
        this.nome = nome;
        this.contaUsuario = new Conta(saldo, this);
        this.sexo = sexo;   
        this.email = email;
        this.senha = senha;
        playlists = new ArrayList<Playlist>();
        addPlaylist("Principal");
        this.avaliacoes = new ArrayList<Avaliacao>();
    }
    
    /**
     * 
     * @param nomeDaPlaylist nome da playlist a ser adicionada pelo usuário
     */
    public void addPlaylist(String nomeDaPlaylist){
        this.playlists.add(new Playlist(nomeDaPlaylist, this));
    }
    
    /**
     * 
     * @param senha nova senha do usuário
     */
    public void setSenha(String senha){
        this.senha = senha;
    }
    
    /**
     * 
     * @return email do usuario
     */
    public String getEmail() {
        return email;
    }
    
    /**
     * 
     * @return senha do usuario
     */
    public String getSenha() {
        return senha;
    }
    
    /**
     * 
     * @return rg do usuario
     */
    public String getRg() {
        return rg;
    }

    /**
     * 
     * @return cpf do usuario
     */
    public String getCpf() {
        return cpf;
    }

    /**
     * 
     * @return nome do usuario
     */
    public String getNome() {
        return nome;
    }

    /**
     * 
     * @param nome novo nome do usuário
     */
    public void setNome(String nome) {
        this.nome = nome;
    }
   
    /**
     * 
     * @return sexo do usuário
     */
    public String getSexo() {
        return sexo;
    }

    /**
     * 
     * @return lista de playlists criadas pelo usuário
     */
    public ArrayList<Playlist> getPlaylists() {
        return playlists;
    }
    
    /**
     * 
     * @param nome nome da playlist procurada
     * @return playlist cujo nome foi passado, null caso não seja encontrada
     */
    public Playlist getPlaylists(String nome) {
        
        Iterator<Playlist> it = playlists.iterator();
        while(it.hasNext())
        {
           Playlist obj = it.next();
           if (obj.equals(new Playlist(nome, this))) return obj;
        }
        return null;    
    }

    /**
     * 
     * @return conta financeira interna do usuário
     */
    public Conta getContaUsuario() {
        return contaUsuario;
    }
    
    @Override
    public String toString() {
        String retorno = "------------------------------\nUsuario:\nNome: " + nome + "\nCPF: " + cpf + "\nRG: " + rg + "\nSexo: " + 
                sexo + "\nEmail: " + email + "\nSenha: " + senha + "\nConta Usuario - " + contaUsuario.toString()
                + "\n---------\nPlaylists: \n";
        
        Iterator<Playlist> it = playlists.iterator();
        while(it.hasNext())
        {
           Playlist obj = it.next();
           retorno += obj.toString() + "\n";
        }
        return retorno;    
    }
    
    @Override
    public boolean equals(Object obj){        
        Usuario outro = (Usuario) obj; 
        return (this.rg.equals(outro.rg) || this.cpf.equals(outro.cpf) || this.email.equals(outro.email));        
    }
    
    public void addAvaliacao(Avaliacao av){
        avaliacoes.add(av);
    }
}